.TITLE XXATT - ATTACH AND DETACH PROCESSING FOR GENERIC DEVICES .IDENT /1.00/ ; ; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reserved ; ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ; BE USED AND COPIED ONLY IN ACCORDANCE WITH THE ; TERMS OF SUCH LICENSE AND WITH THE INCLUSION OF THE ; ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE ; MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO ; AND OWNERSHIP OF THE SOFTWARE IS HEREBY ; TRANSFERRED. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO ; CHANGE WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED ; AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION. ; ; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR ; RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS ; NOT SUPPLIED BY DIGITAL. ; ; KAREN L. NOEL ; ; MACRO LIBRARY CALLS ; .MCALL UCBDF$,CPRDF$ UCBDF$ ,,1 CPRDF$ ;+ ; **-XXATT - PROCESS ATTACH REQUESTS ; ; THIS ROUTINE IS DISPATCHED TO FROM XXDRV AFTER AN IO.ATT REQUEST HAS ; BEEN PROCESSED SUCCESSFULLY BY THE HOST. ; ; IF THE UCB IS HTn: OR HT377:, ALLOCATE AN AST CONTROL BLOCK WITH TWO ; EXTRA WORDS AND PUT THE TCB AND OF THE TASK AND THE LUN IN THOSE FIELDS. ; QUEUE THE AST CONTROL BLOCK AT OFFSET U.RAST OF THE UCB. ; ; IF THE UCB IS NS:, ALLOCATE AN AST CONTROL BLOCK WITH ZERO PARAMETERS. ; ; IF THE UCB IS ANYTHING ELSE, WE'RE DONE. ; ; INPUTS: ; ; R5 => UCB OF UNIT ATTACHED ; R3 => DCB OF UNIT ATTACHED ; R1 => CURRENT I/O PACKET ; ; OUTPUTS: NONE. ; ; REGISTERS MODIFIED: R0, R1, R2, R3 ;- ; ; ; DEFINE LOCAL SYMBOLS AND STORAGE ; MAP6 = 140000 ACBLNK: .BLKW 1 XXATT:: ; ; LOOK FOR ACB IN UCB QUEUE -- IF THIS IS NOT A NETWORK DEVICE, WE WILL WANT ; TO REJECT THE ATTACH IF WE FIND AN ACB (BECAUSE THE DEVICE IS ALREADY ; ATTACHED). IF IT IS A NETWORK DEVICE, WE WILL WANT TO CHECK THE SPECIFIED ; AST ADDRESS. ; MOV R5,R0 ;GET POINTER TO ACB QUEUE LIST HEAD ADD #U.RAST,R0 ; 2$: MOV (R0),R0 ;GET NEXT ACB BEQ 3$ ;IF EQ NOT IN LIST - LOOK OFF TCB CMP A.PRM+14(R0),I.TCB(R1) ;RIGHT TASK? BNE 2$ ;IF NE NO CMPB A.PRM+16(R0),I.LN2(R1) ;RIGHT LUN NUMBER? BNE 2$ ;IF NE NO BR 8$ ;FOUND IT 3$: ; ; SEARCH LIST OFF TCB FOR CORRECT ACB ; MOV I.TCB(R1),R0 ;GET TCB ADDRESS ADD #T.ASTL,R0 ;POINT TO LIST 5$: MOV (R0),R0 ;GET NEXT ACB BEQ 10$ ;IF EQ NONE CMPB A.PRM+16(R0),I.LN2(R1) ; MATCHING LUN? BNE 5$ ;IF NE NO 8$: ; ; WE FOUND AN ACB. NETWORK ACBS GET CHANGED. OTHER DEVICES GET REJECTED. CMP D.NAM(R3),#"NS ; IS THIS THE NETWORK? BNE 45$ ; NO, GO RETURN AN ERROR. ; ; FOUND ACB, CHANGE AST ADDRESS ; MOV I.PRM(R1),A.AST(R0) CLC ; INDICATE SUCCESS. RETURN 10$: ; WE DID NOT FIND AN ACB. CHECK TO SEE IF WE NEED ONE OR THIS ATTACH CAN ; BE PERFORMED WITHOUT AN ACB. CMP D.NAM(R3),#"NS ; IS THIS THE NETWORK? BEQ 12$ ; YES, SKIP OTHER CHECKS AND ACCEPT REQUEST. BIS #SF$BLK,SNDCOD ; INDICATE TASK IS BLOCKED FOR THIS OPERATION. CMP D.NAM(R3),#"HT ; IS THIS ONE OF OUR PSEUDO-TERMINALS? BNE 19$ ; NO, DON'T SET UP AN ACB; U.RAST MAY NOT EXIST. ; ; CHECK FOR UNSOL. CHARACTER AST ; BIT #TF.AST,I.FCN(R1) ;DO WE NEED AN ACB? BEQ 19$ ;IF EQ NO 12$: ; ; ALLOCATE AN AST CONTROL BLOCK ; MOV R1,R3 ;GET ADDRESS OF I/O PACKET MOV #30.,R1 ;SET SIZE OF ACB TO ALLOCATE MOV #ACBLNK,R4 ;GET ADDRESS TO STORE LINK INTO CALL ALACB ;ALLOCATE AN ACB FOR THE ATTACH BCS 40$ ;IF CS, ALLOCATION FAILED...ERROR MOV R5,R0 ;GET UCB ADDRESS ADD #U.RAST,R0 ;POINT TO LINK WORD TST 2(R0) ;IS SECOND WORD EMPTY? BNE 18$ ;IF NE NO MOV R0,2(R0) ;INITIALIZE QUEUE LISTHEAD 18$: MOV R2,R1 ;ADDRESS OF LINK WORD IN AST CONTROL BLOCK CALL $QINSF ;QUEUE IT UP 19$: CLC ; INDICATE SUCCESS. RETURN ;RETURN SUCCESSFULLY ; ; ERROR PROCESSING FOR ATTACH ; 40$: MOV #IE.NOD&377,R0 ;ERROR - NO DYNAMIC MEMORY BR 49$ ; JOIN COMMON ERROR CODE. 45$: MOV #IE.DAA&377,R0 ; INDICATE ERROR, DEVICE ALREADY ATTACHED. 49$: SEC ;INDICATE FAILURE RETURN ; ;+ ; **-ALACB - ALLOCATE AST CONTROL BLOCK ; ; THIS SUBROUTINE ALLOCATES AN AST CONTROL BLOCK AND INITIALIZES THE ; FIXED DATA. DATA THAT IS CHARACTERISTIC-DEPENDENT (SUCH AS A.AST) ; MUST BE SET BY THE CALLER UPON RETURN. ; ; INPUTS: ; R1 = SIZE IN BYTES OF ACB TO ALLOCATE (SAVED IN A.PRM+4) ; R3 => CURRENT I/O PACKET ; R5 => UCB ; ; OUTPUTS: ; CC-C CLEAR IF SUCCESSFUL ALLOCATION; CC-C SET OTHERWISE ; R2 => LINK WORD OF ALLOCATED ACB (ACB'S HAVE NEGATIVE OFFSETS) ; ACBLNK => LINK WORD OF ALLOCATED ACB ; ; THE ALLOCATED ACB IS FORMATTED AS FOLLOWS: ; ; +-------------------------------------+ ; | XXDRV KINAR5 BIAS | A.KSR5 (-4) ; |-------------------------------------| ; | DEQUEUE SUBROUTINE ADDRESS (DQACB) | A.DQSR (-2) ; |-------------------------------------| ; | THREAD WORD (0) | (0) ; |-------------------------------------| ; | LENGTH OF CONTROL BLOCK (0) | A.CBL ; |-------------------------------------| ; | # BYTES TO ALLOC ON STACK | A.BYT ; |-------------------------------------| ; | AST ADDRESS (0) | A.AST ; +-------------------------------------+ ; | # AST PARAMETERS | A.NPR ; |-----------------+-------------------| ; | U.HTID | 0 | A.PRM ; |-----------------+-------------------| ; | UCB OF ATTACHED UNIT | A.PRM+2 ; |-----------------+-------------------| ; | FLAG BYTE | ACB SIZE | A.PRM+4 ; |-----------------+-------------------| ; | ^C AST ADDRESS | A.PRM+6 ; |-------------------------------------| ; | AST ADDRESS | A.PRM+10 ; |-------------------------------------| ; | REMOTE PACKET HEADER BIAS | A.PRM+12 ; |-------------------------------------| ; | TCB ADDRESS OF TASK | A.PRM+14 ; |-------------------------------------| ; | | LUN # | A.PRM+16 ; +-------------------------------------+ ; ; REGISTERS MODIFIED: R1 ;- ; ALACB: CALL $ALOCB ;ALLOCATE SPACE BCS 10$ ;BR IF ERROR MOV KINAR5,(R0)+ ;INSERT DRIVER APR 5 MAPPING (A.KSR5) MOV #DQACB,(R0)+ ;INSERT POINTER TO ROUTINE TO CALL WHEN ;AST BLOCK IS DEQUEUED (A.DQSR) MOV R0,R2 ;SAVE ALLOCATED ACB ADDRESS MOV R0,ACBLNK ;STORE POINTER TO THE ACB TST (R0)+ ;SKIP OVER LINK WORD CLR (R0)+ ;SET BLOCK LENGTH ZERO TO FORCE SYSXT ;TO CALL US WHEN BLOCK IS DEQUEUED (A.CBL) MOV #14.,(R0)+ ;ASSUME NOT A TERMINAL BIT #DV.TTY,U.CW1(R5) ;IS THIS A TERMINAL BEQ 6$ ;IF EQ NO MOV #16.,-2(R0) ;ALLOCATE 16. BYTES ON TASK'S STACK (A.BYT) 6$: CLR (R0)+ ;UNSOLICITED INPUT AST ADDRESS - CLEAR FOR NOW CLR (R0)+ ;NO PARAMETERS BIT #DV.TTY,U.CW1(R5) ;IS THIS A TERMINAL BEQ 7$ ;IF EQ NO MOV #1,-2(R0) ;1 PARAMETER 7$: CLRB (R0)+ ; MOVB I.PRM+2(R3),(R0)+ ;SAVE USER DEFINED TERMINAL ID MOV R5,(R0)+ ;SAVE UCB ADDRESS MOVB R1,(R0)+ ;SAVE AST CONTROL BLOCK SIZE CLRB (R0)+ ;ACB FLAG BYTE CLR (R0)+ ;ASSUME NOT A TERMINAL BIT #DV.TTY,U.CW1(R5) ;IS THIS A TERMINAL BEQ 8$ ;IF EQ NO MOV I.PRM+4(R3),-2(R0) ;SAVE CONTROL-C AST ADDRESS IN ACB IF ONE 8$: MOV I.PRM(R3),(R0)+ ;SAVE AST ADDRESS CLR (R0)+ ;CPRBUF BIAS (FILLED IN BY KXDRV) MOV I.TCB(R3),(R0)+ ;SAVE TCB ADDRESS OF TASK MOVB I.LN2(R3),(R0) ;SAVE LUN NUMBER 10$: RETURN ;ALL DONE ; ;+ ; **-DQACB - DEQUEUE AST CONTROL BLOCK ; ; INPUT: ; R0 - ADDRESS OF AST CONTROL BLOCK ; ;- DQACB:: ; ; GET HEADER ADDRESS FROM AST CONTROL BLOCK ; MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING MOV A.PRM+12(R0),KISAR6 ;MAP HEADER MOV #1,H$STAT+MAP6 ;SET SUCCESS STATUS CLR H$STAT+2+MAP6 ; MOV (SP)+,KISAR6 ;RESTORE MAPPING ; ; SEND RESPONSE TO CPR ; MOV R0,-(SP) ;SAVE ACB ADDRESS CPSEN$ #SN$RSP,A.PRM+12(R0),#H$SIZE+6 MOV (SP)+,R0 ;RESTORE ACB ADDRESS ; ; CHECK FOR ACB MARKED FOR DELETE ; BITB #AF.MDE,A.PRM+5(R0) ;ACB MARKED FOR DELETE? BEQ 10$ ;IF EQ NO JMP DEACB ;DEALLOCATE ACB NOW 10$: ; ; QUEUE AST TO UCB AGAIN ; MOV R0,R1 ;GET ADDRESS OF LINK WORD MOV A.PRM+2(R0),R0 ;GET UCB ADDRESS ADD #U.RAST,R0 ;POINT TO LIST HEAD CALL $QINSF ;QUEUE AST CONTROL BLOCK RETURN .PAGE .SBTTL PPDET - POST-QUEUE PROCESSING FOR DETACH REQUESTS ; ;+ ; **-XXDET - DETACH REQUESTS ; ; THIS ROUTINE IS DISPATCHED TO FROM XXINI AFTER AN IO.DET REQUEST HAS ; BEEN DEQUEUED OR SPECIFY AST REQUEST HAS BEEN MADE FOR THE NETWORK. ; DEALLOCATE AST CONTROL BLOCK. ; ; INPUTS: ; R5 => UCB ; R1 => CURRENT I/O PACKET ; ; OUTPUTS: NONE. ; ; REGISTERS MODIFIED: R0, R1, R2, R3, R4 ;- ; XXDET:: ; ; LOOK FOR ACB IN UCB QUEUE ; MOV R5,R4 ;GET POINTER TO ACB QUEUE LIST HEAD ADD #U.RAST,R4 ; MOV R4,R0 ;SAVE ADDRESS OF LIST HEAD 2$: MOV R0,R2 ;SAVE ADDRESS OF CURRENT MOV (R2),R0 ;GET NEXT ACB BEQ 3$ ;IF EQ NOT IN LIST - LOOK OFF TCB CMP A.PRM+14(R0),I.TCB(R1) ;RIGHT TASK? BNE 2$ ;IF NE NO CMPB A.PRM+16(R0),I.LN2(R1) ;RIGHT LUN NUMBER? BNE 2$ ;IF NE NO ; ; DEQUEUE AST CONTROL BLOCK AND DEALLOCATE IT ; MOV (R0),(R2) ;CLOSE UP LIST BNE 25$ ;IF NE NO NEW LAST MOV R2,2(R4) ;NEW LAST 25$: BR DEACB ;DEALLOCATE AST CONROL BLOCK 3$: ; ; SEARCH LIST OFF TCB FOR CORRECT ACB ; MOV I.TCB(R1),R2 ;GET TCB ADDRESS ADD #T.ASTL,R2 ;POINT TO LIST 5$: MOV (R2),R2 ;GET NEXT ACB BEQ 6$ ;IF EQ NONE CMP A.PRM+2(R2),R5 ;RIGHT UCB? BNE 5$ ;IF NE NO CMPB A.PRM+16(R0),I.LN2(R1) ; RIGHT LUN? BNE 5$ ; NO, KEEP LOOKING. BISB #AF.MDE,A.PRM+5(R2) ;SET BIT TO DEALLOCATE AFTER DEQUEUE 6$: RETURN ;AND FINISH 10$: ; ; DEALLOCATE AST CONTROL BLOCK ; DEACB: MOVB A.PRM+4(R0),R1 ;GET LENGTH OF THE ACB CMP -(R0),-(R0) ;BACK UP TO START OF THE ACB CALL $DEACB ;DEALLOCATE THE BLOCK RETURN ;COMPLETE SUCCESSFUL DETACH .END